/**
 * @desc 将 apis 数据按照 project 中 order 顺序排序，并对数据进行 group
 * @param { Object } apis 接口列表
 * @param { Object } project 项目配置
 * @return { Object } 排序分组后的 apis 集合
 */
function formatData(apis, project) {
  let sortKeys = project["order"]; // 接口排序

  // 如果是对象结构，则转为一维数组
  if(Object.prototype.toString.call(sortKeys) === '[object Object]') {
    sortKeys = [...Object.keys(sortKeys), ...Object.values(sortKeys)].flat()
  }

  // 获取所有的 group name 集合，若不存在则新增 Other 元素
  const groupNames = Array.from(new Set(apis.map((api) => api.group)));

  // order 中有效的 group name 集合
  const usefulNames = sortKeys.filter((k) => groupNames.includes(k));

  // 所有使用到的 group name 排序后集合
  let sortGroupNames = Array.from(new Set([...usefulNames, ...groupNames]));

  if (sortGroupNames.includes("Other")) {
    const index = sortGroupNames.indexOf("Other");
    sortGroupNames.push(...sortGroupNames.splice(index, 1));
  }

  // 将 apis 数据按照 sortKeys 顺序排序
  let orderApis = [];

  sortKeys.map((k) => {
    let index = apis.findIndex((api) => api.name === k);
    if (index > -1) {
      orderApis.push(...apis.splice(index, 1));
    }
  });

  // 排序后的 api 集合
  const allApis = [...orderApis, ...apis];

  // 所有分组
  let groups = sortGroupNames.map((g) => {
    return {
      title: g,
      count: 0,
      children: [],
    };
  });

  // 放入分组
  for (let api of allApis) {
    delete api["url"];
    delete api["filename"];

    const index = groups.findIndex((g) => g.title === api.group);
    groups[index].count++;
    groups[index].children.push(api);
  }

  // 文档分组，固定格式

  // 文档 md 内容
  const docs = project.docs;

  const docList = docs.map(doc => {
    const name = doc.filename.split('.')[0];
    const docOject = project[name];
    delete project[name];
    return docOject;
  })

  let docGroups = [
    {
      title: "Readme",
      count: docList.length,
      children: docList,
    },
  ];

  return [...docGroups, ...groups];
}

module.exports = {
  formatData: formatData,
};
